Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 存储库ASP.NET MVC中的体系结构抽象问题_Asp.net Mvc_Architecture_Data Modeling_Repository Pattern - Fatal编程技术网

Asp.net mvc 存储库ASP.NET MVC中的体系结构抽象问题

Asp.net mvc 存储库ASP.NET MVC中的体系结构抽象问题,asp.net-mvc,architecture,data-modeling,repository-pattern,Asp.net Mvc,Architecture,Data Modeling,Repository Pattern,我正在VS2008上使用MVC ASP.NET 3.5 SP1。 我正在寻找一种方法来抽象我在用户存储库中的这三种方法 public User GetUser(Log log) { return db.Users.FirstOrDefault(u => u.Logs.Any(l => l.id.Equals(log.id))); } public User GetUser(Product product) { return db.Users.FirstOrDefault(u

我正在VS2008上使用MVC ASP.NET 3.5 SP1。
我正在寻找一种方法来抽象我在用户存储库中的这三种方法

public User GetUser(Log log)
{
  return db.Users.FirstOrDefault(u => u.Logs.Any(l => l.id.Equals(log.id)));
}

public User GetUser(Product product)
{
  return db.Users.FirstOrDefault(u => u.Products.Any(pr => pr.id.Equals(product.id)));
}

public User GetUser(Photo photo)
{
  return db.Users.FirstOrDefault(u => u.Photos.Any(ph => ph.id.Equals(photo.id)));
}
My DB.edmx包含模型

User    [id, username, ...]  
Product [id, name, ...]
Photo   [id, name, ...]
Log     [id, data, ...]
对于基于model.id搜索的所有这些(以及未来)方法,是否可能只有一种方法

public User GetUser(Expression<Func<User, bool>> restriction)
{
  return db.Users.Where(restriction).FirstOrDefault();
}
您也可以使用MS:


我的语法可能不太正确,但你明白了。

如果所有相关实体(日志、产品和照片)都将通过公共属性(id INT)进行搜索,那么也许你可以尝试这样的方法

首先,创建一个接口:

public interface IUserAssociation
{
    int id { get; }
}
然后,三个类中的每一个都将实现此接口,如下所示:

public partial class Product : IUserAssociation
{
}
GetUser方法的外观如下所示:

public User GetUser<T>(T entity) where T : IUserAssociation
{
    var type = typeof(T);
    if (type == typeof(Log))
    {
        return db.Users.FirstOrDefault(u => u.Logs.Any(l => l.id.Equals(entity.id)));
    }
    else if (type == typeof(Product))
    {
        return db.Users.FirstOrDefault(u => u.Products.Any(pr => pr.id.Equals(entity.id)));
    }
    else if (type == typeof(Photo))
    {
        return db.Users.FirstOrDefault(u => u.Photos.Any(ph => ph.id.Equals(entity.id)));
    }
    else
    {
        throw new ArgumentException();
    }
}
公共用户GetUser(T实体),其中T:IUserAssociation
{
var类型=类型(T);
如果(类型==类型(日志))
{
返回db.Users.FirstOrDefault(u=>u.Logs.Any(l=>l.id.Equals(entity.id));
}
否则如果(类型==类型(产品))
{
返回db.Users.FirstOrDefault(u=>u.Products.Any(pr=>pr.id.Equals(entity.id));
}
否则如果(类型==类型(照片))
{
返回db.Users.FirstOrDefault(u=>u.Photos.Any(ph=>ph.id.Equals(entity.id));
}
其他的
{
抛出新ArgumentException();
}
}

然后,您应该能够调用GetUser并从一个方法向其传递日志、照片或产品实体。它不是很优雅,但适用于这种特殊情况。

我更喜欢克雷格的解决方案,但我建议:

Repository.GetUser(u => u.Logs, log);
如果您的所有实体都来自

public interface IEntity { public int Id { get; } }
然后方法会是这样的

public User GetUser<T, Y>(Func<T, IList<Y>> getlist, Y sample)
   where T: IEntity
   where Y: IEntity
{
  return db.Users.Select(x => getlist(x).Any(y => y.Id == sample.Id)).FirstOrDefault();
}
公共用户GetUser(Func getlist,Y示例)
其中T:
其中Y:
{
返回db.Users.Select(x=>getlist(x).Any(y=>y.Id==sample.Id)).FirstOrDefault();
}

另外,如果我们采用S#arp体系结构的思想,即如果entity1.Id==entity2.Id(对于持久实体),那么等于(entity1,entity2)-我们可以使用getlist(x).Contains(示例)。

。但是我需要一个“更自动化”的表达式,可能使用类名。然后使用MS Dynamic LINQ来做同样的事情。我会更新这个例子。谢谢,我想我会试试你建议的最后一个。
public interface IEntity { public int Id { get; } }
public User GetUser<T, Y>(Func<T, IList<Y>> getlist, Y sample)
   where T: IEntity
   where Y: IEntity
{
  return db.Users.Select(x => getlist(x).Any(y => y.Id == sample.Id)).FirstOrDefault();
}