4

我有以下课程:

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 Entities 不支持指定的类型成员“用户名”。仅支持初始化程序、实体成员和实体导航属性。

我明白为什么会出现异常,但我想知道是否有办法使用该界面执行此查询?

4

3 回答 3

2

回答你的问题:

Is it possible to query on an interface property?

是的。没问题。你得到的错误不是因为接口。

问题是您无法使用 Linq 2 实体查询不是映射的属性

其他人也有这个问题。

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

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

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

于 2013-03-15T12:07:08.850 回答
0

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

通常我不会推荐这个。

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();
    }
}
于 2013-03-15T12:13:58.013 回答
0

一些解决方法:

  • 您可以尝试在运行时确定底层实体类型,
    然后动态编译并调用使用该类型执行查询的通用方法。

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

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

于 2013-03-15T14:30:58.527 回答