是否可以查询接口属性?

时间:2013-03-15 12:00:25

标签: c# entity-framework entity-framework-5

我有以下课程:

public class BicycleSellerListing : IUserName
{
    public UserProfile UserProfile { get; set; }

    /// <summary>
    /// IUserName interface property
    /// </summary>
    public string UserName
    {
        get
        {
            return UserProfile.UserName;
        }
    }
}

界面:

public interface IUserName
{
    string UserName { get; }
}

这个查询:

public static List<T> GetList<T>(string userName) where T : class, IUserName
{
    using (SqlUnitOfWork work = new SqlUnitOfWork())
    {
        return work.GetList<T>(row => row.UserName == userName)
            .ToList();
    }
}

当我执行此查询时,我得到以下异常:

  

LINQ to不支持指定的类型成员'UserName'   实体。仅初始化程序,实体成员和实体导航   支持属性。

我理解为什么我会收到异常,但我想知道是否有办法可以使用界面执行此查询?

3 个答案:

答案 0 :(得分:2)

回答你的问题:

Is it possible to query on an interface property?

是。没问题。你得到的错误不是因为界面。

问题是你无法查询不是Linq 2实体的属性

Other people也有这个问题。

底层表达式构建器无法区分映射到数据库的属性和不映射到数据库的属性。

这是一个问题,因为编译器无法帮助你。 在Linq to object中,没有问题,因此编译器不会抛出任何错误/警告

您应该尝试清楚地说明此属性未映射 - 可能是通过前缀或包含所有“自定义”属性的嵌套类。

答案 1 :(得分:0)

除现有答案外,您还可以执行内存中的位置,但这意味着检索整个表格。

通常我不建议这样做。

public static List<T> GetList<T>(string userName) where T : class, IUserName
{
    using (SqlUnitOfWork work = new SqlUnitOfWork())
    {
        return work.GetList<T>()
            .AsEnumerable()
            .Where(row => row.UserName == userName)
            .ToList();
    }
}

答案 2 :(得分:0)

一些解决方法:

  • 您可以尝试在运行时确定基础实体类型 然后动态编译并调用执行查询的泛型方法 这种类型。

  • 可以在运行时使用手动组装此查询 表达类

  • 您可以尝试使用Entity SQL查询语法而不是Linq

相关问题