使用实体框架查询通知系统

时间:2014-08-14 20:22:18

标签: asp.net asp.net-mvc database entity-framework asp.net-mvc-4

我正在开发一个MVC4应用程序,我建立了一个通知系统,向订阅公司的用户发送有关海豹的新闻,以便我保存用户上次访问该网站的时间以及销售时间并且在下一次用户回到现场时,我主持用户上次访问该网站所有产品的密封时间,如果产品密封时间比上次访问用户大,则返回所有指定此条件的产品但我不能让用户订阅的公司也只能从这些公司获得这个产品这是我的数据库:

database

这就是我在实体框架中要做的事情:

public ActionResult LastTimeVisedSales()
    {
        if (User.Identity.IsAuthenticated)
        {

   var UserCompaniesSubscribed = db.SubscribDetails.Include(sub => sub.User).Include(sub => sub.Company)
                                   .Where(sub => sub.UserID == CurrentUserID).ToList();

   var LastTimeVisetDate = db.UserProfiles.Where(p => p.UserID == CurrentUserID)
                             .Select(user => new
                              {
                             lastTimeViset = user.LastLogin
                              }).SingleOrDefault();

  var lastlogin = LastTimeVisetDate.lastTimeViset;

  List<ProductsIndexViewModel> Result = new List<ProductsIndexViewModel>();

      foreach(var d in UserCompaniesSubscribed){

         var ProductNewsLogIn = db.Products.Include(p => p.SubCategory).Include(p => p.Store)
                                .Where(p => p.SalesTime >= lastlogin && p.Store.Company.CompanyID == d.CompanyID )
                                .Select(p => new ProductsIndexViewModel
                                {
                                    ProductID = p.ProductID,
                                    ProductImageURL = p.ProductImageURL,
                                    ProductName = p.ProductName,
                                    Price = p.Price,
                                    Quantity = p.Quantity,
                                    Sales = p.Sales,
                                    Discount = p.Discount,
                                    NewPrice = p.NewPrice,
                                    StoreName = p.Store.StoreName,
                                    CategoryName = p.SubCategory.Category.CategoryName,
                                    SubCategoryName = p.SubCategory.SubCategoryName,
                                    CompanyName = p.Store.Company.CompanyName
                                }).SingleOrDefault();

                Result.Add(ProductNewsLogIn);
                }

            return Json(Result);
        }

        return Json("no seals from last time log in");
    }

并提前感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

请尝试此查询。

基本上,我们使用简单查询找到用户的上次登录日期。 然后查询属于公司所拥有的商店的所有产品,用户已订阅。

请注意,我们可以利用EF的关联来避免加入。 另外,如果在where子句中使用关联实体,则它在select子句中自动可用。你不需要做一个明确的Include。例如p。存储在下面。

var userProfile = db.UserProfiles.SingleOrDefault(up => up.UserID == CurrentUserID);

if (userProfile != null)
{
 var lastLoginDate = userProfile.LastLogin; 
 var companyIds = db.Companies.Where(c => c.UserID == CurrentUserID).Select(c => c.CompanyID);

 var productViewModels = db.Products.Include(p => p.SubCategory)
                                    .Join(companyIds, p => p.Stores.CompanyID, c => c, (p, c) => p) 
                                    .Where(p => p.SalesTime >= lastLoginDate)
                                    .Select(p => new ProductsIndexViewModel
                                     {
                                      ProductID = p.ProductID,
                                      ProductImageURL = p.ProductImageURL,
                                      ProductName = p.ProductName,
                                      Price = p.Price,
                                      Quantity = p.Quantity,
                                      Sales = p.Sales,
                                      Discount = p.Discount,
                                      NewPrice = p.NewPrice,
                                      StoreName = p.Store.StoreName,
                                      CategoryName = p.SubCategory.Category.CategoryName,
                                      SubCategoryName = p.SubCategory.SubCategoryName,
                                      CompanyName = p.Store.Company.CompanyName
                                     }).ToList();
}

我们甚至可以将上述全部内容合并到一个巨型查询中,该查询也会计算最后一次内联登录。无论你喜欢什么,为了清晰起见。

答案 1 :(得分:0)

var products = db.Products.Where(p => p.SalesTime > user.LastLogin && user.Companies.Contains(p.Store.Company));

<强>注意事项

对于这样的问题,最好是发布POCO,因为表格列与您用于查询的实体框架API实际上几乎没有关系。因此,我根据您的列名和关系猜测属性名称。它假设您的课程中包含以下内容:

public class UserProfile
{
    // M2M between dbo.UserProfile and dbo.Companies through dbo.SubscribDetails
    public virtual ICollection<Company> Companies { get; set; }

    ...
}

public class Product
{
    // Foreign key to dbo.Stores via StoreID
    public virtual Store Store { get; set; }

    ...
}

public class Store
{
    // Foreign key to dbo.Companies via CompanyID
    public virtual Company Company { get; set; }

    ...
}