是否可以查询接口属性

本文关键字:接口 属性 查询 是否 | 更新日期: 2023-09-27 18:03:59

我有以下类:

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'实体。只有初始化式、实体成员和实体导航

我明白为什么我得到异常,但我想知道是否有一种方法我可以使用接口执行此查询?

是否可以查询接口属性

回答你的问题:

Is it possible to query on an interface property?

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

问题是你不能查询没有映射到Linq 2实体的属性

其他人也有这个问题。

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

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

你应该试着弄清楚this属性没有被映射——也许是通过一个前缀,或者一个包含所有"自定义"属性的嵌套类。

除了现有的答案之外,还可以在内存中执行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();
    }
}

一些变通方法:

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

  • 可以在运行时使用表达类

  • 你可以尝试实体SQL查询语法代替Linq