无法将类型'DbSet <logs>'隐式转换为'Logs'

时间:2017-07-11 18:19:15

标签: c# entity-framework linq asp.net-web-api

我在dbcontext api方法页面中遇到以下模块的问题,我是否应该尝试将日志转换为日志?

using System; 
using System.Collections.Generic; 
using System.Data.Entity; 
using System.Linq; 
using System.Net; 
using System.Net.Http; 
using System.Web.Http; 

namespace Logging.Models 
{
    public class Log : DbContext    
    {
        public Log() : base("name=LogContext")      
        {
            Database.SetInitializer<Log>(null);
         }

        public DbSet<Logs> Logs { get; set; }

        public Logs GetLog(int Id)      
        {           
            return Logs.Find(Id);       
        }

        public Logs AddLog(Logs p)      
        { 
            Logs.Add(p);
            SaveChanges();
            return p;       
        }       

        public Logs GetLogsByName(string lookupname) 
        {
            List<Logs> mylist = new List<Logs>(); 
            mylist = mylist.Where(p =>
                p.LoggerName.Contains(lookupname)).ToList();            

            foreach (var item in mylist) 
            {
                Logs.Add(item);
            }

            return Logs; <-- error come here see subject line
        }
    }
}

3 个答案:

答案 0 :(得分:4)

这是你的方法应该是这样的,以便搜索在数据库中完成(而不是在内存中),并且该方法返回与过滤器匹配的日志列表:

public List<Logs> GetLogsByName(string lookupname) 
{
    return this.Logs.Where(p => p.LoggerName.Contains(lookupname)).ToList();   
}

答案 1 :(得分:3)

LogsDbSet<Logs>类型的属性,其中Logs也是一种类型。这可能是混乱。您的return语句不会返回Logs类型,而是Logs属性(类型为DbSet<Logs>)。您可以通过更好的命名来清除您的困惑。

DbSet<Logs>可以投放到IEnumerable<Logs>IQueryable<Logs>,但您的使用情况会使Logs类似于某种类型的集合(您没有展示这是Logs类,这意味着你要返回一个无法转换为简单集合的集合集合。

答案 2 :(得分:-2)

我的控制器:

    [System.Web.Http.HttpGet]
    [System.Web.Http.Route("GetByName")]
    public IEnumerable<Logs> GetByName(string loggername)
    {
        var log = _repository.GetLogsByName(loggername);
        if (log == null)
        {
            throw new HttpResponseException(
                Request.CreateResponse(HttpStatusCode.NotFound));
        }
        else
        {
            return log;
        }
    }

我的dbcontext无论如何:

        public IEnumerable<Logs> GetLogsByName(string lookupname)
    {
        List<Logs> mylist = Logs.ToList<Logs>();
        return  mylist.Where(p => p.LoggerName.Contains(lookupname)).ToList();

    }