【问题标题】:Asp.net web api linq query generic type [duplicate]Asp.net web api linq查询泛型类型[重复]
【发布时间】:2017-08-07 22:15:50
【问题描述】:
public class Entity<T> : IEntity<T>
    where T:struct
{
  public T ID { get; set; }
  public bool IsDeleted { get; set; }
}

public class EntityRepository<T,Y> : IRepository<T,Y>
    where T : Entity<Y>
    where Y : struct
{
  public virtual async Task<T> GetByID(Y id)
  {
    return await con.Set<T>().FirstOrDefaultAsync(p => p.ID == id && !p.IsDeleted);
  } 
}

我有一个通用域和存储库。 我的问题是不能应用'Y'和'Y'

【问题讨论】:

  • 您能否提供完整的错误消息,以及它发生在哪一行代码?
  • p.ID == id 有问题。运算符“==”不能应用于“Y”和“Y”类型的操作数

标签: c# asp.net generic-programming


【解决方案1】:

你可以使用Equals方法:

p => p.ID.Equals(id)

【讨论】:

  • @anılyıldırım 请更新问题并向我们展示您如何创建EntityRepository
  • 您的解决方案无效。 exceptionMessage=无法创建“System.Object”类型的常量值。此上下文仅支持原始类型或枚举类型
  • @anılyıldırım 看起来您的问题出在未显示的代码中。我只是用Equalsit works替换了==
【解决方案2】:

从您的代码看来,您正在将类型 T(它是一个已定义的结构)与泛型类型 Y(我假设在运行时这实际上也是一个类型 T)进行比较。

你的问题很可能是你没有为你的结构重载相等运算符。

public static bool operator ==(MyStruct arg1, MyStruct arg2) 
{
    return arg1.Equals(arg2);
}

public static bool operator !=(MyStruct arg1, MyStruct arg2)
{
   return !arg1.Equals(arg2);
}

【讨论】:

    【解决方案3】:

    没关系

    public class EntityRepository<T,Y> : IRepository<T,Y>
              where T : Entity<Y>
              where Y : struct
        {
     public virtual async Task<T> GetByID(Y id, bool isDeleted=false)
            {
                var result = await con.Set<T>().FirstOrDefaultAsync(x=>(object)x.ID==(object)id);
                return result;
            } 
    
        }
    

    【讨论】:

    • 不,这样不行。它适用于实体框架,但不适用于 Linq to Objects。您需要将 Y 约束为 IComparable,然后您的原始代码就可以正常编译了。
    【解决方案4】:

    作为以下答案,您可以使用简单的 hack,代码如下 ;)

    Repository.Get<TEntity, TKey>(e => (object)e.Id == (object)EntityId);
    

    https://stackoverflow.com/a/10423451/7511392

    【讨论】:

    • 这个问题已经有了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    相关资源
    最近更新 更多